package jp.co.toshiba.ffsa.service.csde;

import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;

import jp.co.toshiba.ffsa.entity.Project;
import jp.co.toshiba.ffsa.entity.System;
import jp.co.toshiba.ffsa.entity.User;
import jp.co.toshiba.ffsa.entity.Workflow;
import jp.co.toshiba.ffsa.mail.SendMaiMail;
import jp.co.toshiba.ffsa.service.common.CommonService;
import jp.co.toshiba.ffsa.service.common.ConstantValue;

import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.extension.jdbc.where.SimpleWhere;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
import org.seasar.mai.mail.MailAddress;
import org.seasar.struts.util.MessageResourcesUtil;

import com.ozacc.mail.MailSendException;



/**
 * 設計I/F - 新規プロジェクト作成確認画面 サービスクラス
 * @author npc
 */
public class Csde203Service {
    /** メールアドレス */
    public String emailAddress;
    /** ユーザーID */
    public String userId;
    /** プロジェクトID */
    public String projectId;
    /** プロジェクト名 */
    public String projectName;
    /** プロジェクト説明 */
    public String description;
    /** システムマスタ */
    public List<System> system = null;
    /** ユーザーマスタ */
    private User user = null;
    /** エラーコード */
    private String errorCode;
    /**
     * プロジェクト情報を登録する
     * @return boolean
     * @throws Exception
     */
    public Boolean insertProjectInfo() throws Exception {
        boolean successFlag = false;
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // プロジェクトID取得
            getProjectIdSequence();
            // 当日取得
            Calendar cal = Calendar.getInstance();
            Timestamp sysDateTime = new Timestamp(cal.getTime().getTime());

            // プロジェクト情報を登録
            Project project             = new Project();
            project.projectId           = this.projectId;
            project.projectName         = this.projectName;
            project.description         = this.description;
            project.userId              = this.userId;
            project.currentWorkflowId   = ConstantValue.preparation;
            project.esStatus            = 1;
            project.createdAt           = sysDateTime;
            project.createdBy           = this.userId;
            project.updatedAt           = sysDateTime;
            project.updatedBy           = this.userId;
            project.deleteFlag          = ConstantValue.deleteFlagEnabled;

            // 登録
            jdbcManager.insert(project).includes("projectId"
                                                ,"projectName"
                                                ,"description"
                                                ,"userId"
                                                ,"currentWorkflowId"
                                                ,"esStatus"
                                                ,"createdAt"
                                                ,"createdBy"
                                                ,"updatedAt"
                                                ,"updatedBy"
                                                ,"deleteFlag"
                                                ).execute()
                                                ;
            successFlag = true;
        }catch(Exception e){
            throw e;
        }
        return successFlag;
    }
    /**
     * プロジェクトIDを取得する。
     * 7桁まで左端に'0'を埋め込みした値
     * @throws Exception
     */
    public void getProjectIdSequence( ) throws Exception {
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        jdbcManager.updateBySqlFile(
                   "data/updProjectSequence.sql")
                   .execute();

        // プロジェクトID取得
        this.projectId = jdbcManager.selectBySql(String.class
                                    ,"SELECT lpad(LAST_INSERT_ID(),7,'0') FROM sequence_project")
                                    .getSingleResult()
                                    ;
    }

    /**
     * ワークフロー情報の登録
     * @return boolean
     * @throws Exception
     */
    public Boolean insertWorkflowInfo() throws Exception{
        boolean successFlag = false;
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // ワークフローのステータス名取得
            getWorkflowStatus();

            // 当日取得
            Calendar cal = Calendar.getInstance();
            Timestamp sysDateTime = new Timestamp(cal.getTime().getTime());

            // システムマスタ検索結果の件数分登録
            Workflow workflow = new Workflow();
            for (int i = 0; i < this.system.size(); i++) {
                workflow.projectId          = this.projectId;
                workflow.workflowId         = this.system.get(i).systemId2;
                workflow.revision           = "1";
                if(this.system.get(i).systemId2 == null){
                    workflow.status = Integer.valueOf(ConstantValue.nullData);
                }else{
                    if((ConstantValue.preparation).equals(this.system.get(i).systemId2)){
                        workflow.status = Integer.valueOf(ConstantValue.inPreparation);
                    }else{
                        workflow.status = Integer.valueOf(ConstantValue.nullData);
                    }
                }
                workflow.workflowName       = this.system.get(i).value1;
                workflow.seq                = this.system.get(i).seq;
                workflow.createdAt          = sysDateTime;
                workflow.createdBy          = this.userId;
                workflow.updatedAt          = sysDateTime;
                workflow.updatedBy          = this.userId;
                workflow.deleteFlag         = ConstantValue.deleteFlagEnabled;

                // 登録
                jdbcManager.insert(workflow).includes("projectId"
                                                     ,"workflowId"
                                                     ,"revision"
                                                     ,"status"
                                                     ,"workflowName"
                                                     ,"seq"
                                                     ,"createdAt"
                                                     ,"createdBy"
                                                     ,"updatedAt"
                                                     ,"updatedBy"
                                                     ,"deleteFlag"
                                                     ).execute()
                                                     ;
            }
            successFlag = true;
        }catch(Exception e){
            throw e;
        }
        return successFlag;
    }

    /**
     * ワークフローのステータス名をシステムマスタから取得する。
     * @throws Exception
     */
    public void getWorkflowStatus() throws Exception{
        // S2Container初期化
        SingletonS2ContainerFactory.init();
        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        // 検索条件
        SimpleWhere swh = new SimpleWhere().eq("systemId1", "workflow" )
                                           .eq("deleteFlag", ConstantValue.deleteFlagEnabled)
                                           ;
        // ステータス名取得
        this.system = jdbcManager.from(System.class)
                                         .where(swh)
                                         .getResultList()
                                         ;
    }

    /**
     * ユーザー情報取得処理
     * @throws Exception
     */
    public User getUser() throws Exception{

        // S2Container初期化
        SingletonS2ContainerFactory.init();

        // S2ContainerからJdbcManagerを取得
        JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
        try{
            // 検索条件
            SimpleWhere swh = new SimpleWhere().eq("userID", this.userId)
                                               .eq("deleteFlag", ConstantValue.deleteFlagEnabled);

            // 一覧取得
            user= jdbcManager.from(User.class)
                             .where(swh)
                             .getSingleResult()
                             ;
            if(user != null){
                this.emailAddress = user.mailAddress;
            }
        }catch(Exception e){
            throw e;
        }
        return user;
    }

    /**
     * メール送信処理
     * プロジェクト作成確認メール
     * @return 処理結果
     * @throws Exception エラー
     */
    public Boolean mailSend( ) throws Exception {
        boolean successFlag = false;
        try {
            // 顧客情報取得
            getUser();

            // メール情報をセット
            SendMaiMail sendMaiMail = new SendMaiMail();

            // 送信元メールアドレス(From)
            sendMaiMail.setMailAddressFrom(MessageResourcesUtil.getMessage("mail_address_from"));

            // 送信先メールアドレス(To)
            CommonService commonService = new CommonService();
            MailAddress[] sendMailAddressTo = commonService.getAdministratorAndSuperUserMailaddress(user.region);
            sendMaiMail.setMailAddressTo(sendMailAddressTo);

            // 置き換え文字列
            sendMaiMail.setReplacementItem1(user.mailAddress);
            sendMaiMail.setReplacementItem2(projectName);
            sendMaiMail.setReplacementSubject("");

            // 送信
            successFlag = sendMaiMail.sendMail(ConstantValue.newProject);

            if(!successFlag){
                this.errorCode = "csde203.901";
                return false;
            }

        }catch(MailSendException m){
            return false;
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }
        return true;
    }

    /**
     * 入力チェックエラーコードを取得する
     * @return errorCode
     */
    public String getErrorCode(){return this.errorCode;}

    /**
     * ユーザーIDをセットする
     * @param userId
     */
    public void setUserId(String userId) {this.userId = userId;}
}
